Skip to content

Commit

Permalink
Merge pull request #74 from NSPManager/devel
Browse files Browse the repository at this point in the history
Update main with latest devel
  • Loading branch information
tpanajott authored Aug 11, 2023
2 parents bb24119 + d97e19d commit 283781c
Show file tree
Hide file tree
Showing 26 changed files with 111 additions and 40 deletions.
8 changes: 8 additions & 0 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ jobs:
replace: "${{ github.ref_name }}"
regex: true
include: "docker/config.yaml"
- uses: actions/checkout@v3
- name: Update displayed version in web interface footer
uses: jacobtomlinson/gha-find-replace@v3
with:
find: "[0-9]+.[0-9]+.[0-9]+"
replace: "${{ github.ref_name }}"
regex: true
include: "docker/web/nspanelmanager/web/templates/footer.html"
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Push updated version back to repo
Expand Down
2 changes: 1 addition & 1 deletion docker/docker-build_and_run_dev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ if [ ! -e "data/secret.key" ] && [ -e "$(pwd)/web/nspanelmanager/secret.key" ];
cp "$(pwd)/web/nspanelmanager/secret.key" "data/secret.key"
fi

docker build -t nspanelmanager . && docker run --rm --name nspanelmanager -it -v /etc/timezone:/etc/timezone:ro -v "$(pwd)/web":/usr/src/app/ -v "$(pwd)/data":/data/ -p 8000:8000 -p 8001:8001 nspanelmanager /bin/bash && docker rmi nspanelmanager
docker build -t nspanelmanager . && docker run --rm --name nspanelmanager --mac-address 02:42:ac:11:ff:ff -it -v /etc/timezone:/etc/timezone:ro -v "$(pwd)/web":/usr/src/app/ -v "$(pwd)/data":/data/ -p 8000:8000 -p 8001:8001 nspanelmanager /bin/bash && docker rmi nspanelmanager
Binary file modified docker/web/nspanelmanager/data_file.bin
Binary file not shown.
Binary file modified docker/web/nspanelmanager/firmware.bin
Binary file not shown.
Binary file modified docker/web/nspanelmanager/merged_flash.bin
Binary file not shown.
3 changes: 2 additions & 1 deletion docker/web/nspanelmanager/nspanelmanager/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/data/nspanelmanager_db.sqlite3'
'NAME': '/data/nspanelmanager_db.sqlite3',
'timeout': 20
}
}

Expand Down
2 changes: 1 addition & 1 deletion docker/web/nspanelmanager/web/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,6 @@ def register_nspanel(request):

new_panel.mac_address = data['mac_address']
new_panel.version = data["version"]
new_panel.last_seen = datetime.now()
new_panel.ip_address = get_client_ip(request)
fs = FileSystemStorage()
if "md5_firmware" in data:
Expand Down Expand Up @@ -274,6 +273,7 @@ def get_nspanel_config(request):
base = {}
base["name"] = nspanel.friendly_name
base["home"] = nspanel.room.id
base["default_page"] = get_nspanel_setting_with_default(nspanel.id, "default_page", "0")
base["raise_to_100_light_level"] = get_setting_with_default(
"raise_to_100_light_level", 95)
base["color_temp_min"] = get_setting_with_default("color_temp_min", 2000)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.1.7 on 2023-08-11 20:15

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('web', '0034_nspanel_md5_data_file_nspanel_md5_firmware_and_more'),
]

operations = [
migrations.RemoveField(
model_name='nspanel',
name='last_seen',
),
]
1 change: 0 additions & 1 deletion docker/web/nspanelmanager/web/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ def _default_nspanel_status_data():
class NSPanel(models.Model):
mac_address = models.CharField(max_length=17)
friendly_name = models.CharField(max_length=100)
last_seen = models.DateTimeField(default=django.utils.timezone.now)
ip_address = models.CharField(max_length=15, default="")
version = models.CharField(max_length=15, default="")
room = models.ForeignKey(Room, on_delete=models.CASCADE)
Expand Down
8 changes: 5 additions & 3 deletions docker/web/nspanelmanager/web/templates/base.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{% load static %}

<!DOCTYPE html>
<html lang="en">
<html lang="en" style="height: 100%;">

<head>
<meta charset="UTF-8">
Expand All @@ -21,15 +21,17 @@
<title>NSPanelManager</title>
</head>

<body>
<body style="min-height: 100%;">
{% include 'modals.html' %}
{% include 'navbar.html' %}

<div class="container mt-4">
<div class="container mt-4 is-fullheight">
<div id="notification_holder" class="pb-4"></div> <!-- Displays any warnings or errors -->
{% block content %}
{% endblock %}
</div>

{% include 'footer.html' %}
</body>

</html>
14 changes: 13 additions & 1 deletion docker/web/nspanelmanager/web/templates/edit_nspanel.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ <h2 class="subtitle is-6">MAC: <span id="nspanel_mac">{{ panel.mac_address }}</s
<span class="is-hidden" id="max_live_log_messages">{{ max_live_log_messages }}</span>
<div class="box">
<div class="notification is-info is-light">
Changes to NSPanel settings on this page requires a reboot of each panel to take effect.
Changes to NSPanel settings on this page requires a reboot of the panel to take effect.
</div>
<form method="POST" action="{% url 'save_panel_settings' panel_id=panel.id %}">
{% csrf_token %}
Expand All @@ -65,6 +65,18 @@ <h2 class="subtitle is-6">MAC: <span id="nspanel_mac">{{ panel.mac_address }}</s
</div>
</div>
</div>
<div class="field">
<label class="label">Default page</label>
<div class="control">
<div class="select">
<select name="default_page">
<option value="0" {% if settings.default_page == "0" %}selected{% endif %}>Main page</option>
<option value="1" {% if settings.default_page == "1" %}selected{% endif %}>Scenes page</option>
<option value="2" {% if settings.default_page == "2" %}selected{% endif %}>Room page</option>
</select>
</div>
</div>
</div>
<div class="field">
<label class="checkbox">
{% if settings.lock_to_default_room == "True" %}
Expand Down
7 changes: 6 additions & 1 deletion docker/web/nspanelmanager/web/templates/edit_room.html
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,12 @@ <h2 class="title is-4">Room settings</h2>
</div>
</div>
<button class="button is-primary">Save</button>
<a href="{% url 'delete_room' room_id=room.id %}" class="button is-danger">Delete</a>
<a href="{% if total_num_rooms != 1 %}{% url 'delete_room' room_id=room.id %}{% else %}#{% endif %}" class="button is-danger" {% if total_num_rooms == 1 %}disabled{% endif %}>Delete</a>
{% if total_num_rooms == 1 %}
<div class="notification is-danger mt-3">
The last room cannot be deleted. Rename this room or create another room before removing this one.
</div>
{% endif %}
</form>
</div>
<hr>
Expand Down
3 changes: 3 additions & 0 deletions docker/web/nspanelmanager/web/templates/footer.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<footer style="position: absolute; left: 0.25rem; bottom: 0.25rem">
Version: 0.1.19
</footer>
2 changes: 1 addition & 1 deletion docker/web/nspanelmanager/web/templates/navbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
</div>
<div class="navbar-end">
<a class="navbar-item" href="/manual">
<span class="icon is-small">
<span class="icon is-small pr-1">
<span class="mdi mdi-file-pdf-box"></span>
</span>
<span>
Expand Down
41 changes: 25 additions & 16 deletions docker/web/nspanelmanager/web/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,22 +113,15 @@ def move_room_down(request, room_id: int):


def edit_room(request, room_id: int):
total_num_rooms = Room.objects.all().count()
room = Room.objects.filter(id=room_id).first()
data = {
'room': room,
'light1': Light.objects.filter(room=room, room_view_position=1).first(),
'light2': Light.objects.filter(room=room, room_view_position=2).first(),
'light3': Light.objects.filter(room=room, room_view_position=3).first(),
'light4': Light.objects.filter(room=room, room_view_position=4).first(),
'light5': Light.objects.filter(room=room, room_view_position=5).first(),
'light6': Light.objects.filter(room=room, room_view_position=6).first(),
'light7': Light.objects.filter(room=room, room_view_position=7).first(),
'light8': Light.objects.filter(room=room, room_view_position=8).first(),
'light9': Light.objects.filter(room=room, room_view_position=9).first(),
'light10': Light.objects.filter(room=room, room_view_position=10).first(),
'light11': Light.objects.filter(room=room, room_view_position=11).first(),
'light12': Light.objects.filter(room=room, room_view_position=12).first(),
'total_num_rooms': total_num_rooms
}
lights = Light.objects.filter(room=room, room_view_position__gte=1, room_view_position__lte=12);
for light in lights:
data["light" + str(light.room_view_position)] = light
return render(request, 'edit_room.html', data)

def save_new_room(request):
Expand All @@ -140,8 +133,17 @@ def save_new_room(request):


def delete_room(request, room_id: int):
Room.objects.filter(id=room_id).delete()
restart_mqtt_manager()
num_rooms = Room.objects.all().count()
if num_rooms > 1:
room = Room.objects.filter(id=room_id).first()
if num_rooms >= 2:
print("Other room available. Moving panels to other room.")
nspanels = NSPanel.objects.filter(room=room)
new_room = Room.objects.all().exclude(id=room.id).first()
nspanels.update(room=new_room)
room.delete()

restart_mqtt_manager()
return redirect('rooms')


Expand Down Expand Up @@ -173,6 +175,7 @@ def edit_nspanel(request, panel_id: int):
"button1_custom_mqtt_payload": get_nspanel_setting_with_default(panel_id, "button1_mqtt_payload", ""),
"button2_custom_mqtt_topic": get_nspanel_setting_with_default(panel_id, "button2_mqtt_topic", ""),
"button2_custom_mqtt_payload": get_nspanel_setting_with_default(panel_id, "button2_mqtt_payload", ""),
"default_page": get_nspanel_setting_with_default(panel_id, "default_page", "0"),
}

return render(request, 'edit_nspanel.html', {
Expand Down Expand Up @@ -253,6 +256,7 @@ def save_panel_settings(request, panel_id: int):
set_nspanel_setting_value(panel_id, "relay1_default_mode", request.POST["relay1_default_mode"])
set_nspanel_setting_value(panel_id, "relay2_default_mode", request.POST["relay2_default_mode"])
set_nspanel_setting_value(panel_id, "temperature_calibration", float(request.POST["temperature_calibration"]))
set_nspanel_setting_value(panel_id, "default_page", request.POST["default_page"])
panel.save()
return redirect('edit_nspanel', panel_id)

Expand Down Expand Up @@ -310,9 +314,14 @@ def add_light_to_room(request, room_id: int):
newLight.openhab_item_rgb = ""

if newLight.room_view_position == 0:
all_lights = Light.objects.filter(room=room, room_view_position__gte=1, room_view_position__lte=12);
for i in range(1, 13):
# TODO: Review to only make one call to database.
if not Light.objects.filter(room=room, room_view_position=i).exists():
position_free = True
for light in all_lights:
if light.room_view_position == i:
position_free = False
break
if position_free:
newLight.room_view_position = i
break

Expand Down
3 changes: 0 additions & 3 deletions firmware/NSPanelManagerFirmware/build_and_upload.sh
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,6 @@ data_file_status="$?"
curl http://"$NSPanelManager_address":"$NSPanelManager_port"/save_new_merged_flash -F [email protected]
data_file_status="$?"

# Wait for Django to process files.
sleep 5

if [ "$firmware_status" -eq 0 ] && [ "$data_file_status" -eq 0 ]; then
echo "Firmware built and uploaded to manager."
else
Expand Down
2 changes: 1 addition & 1 deletion firmware/NSPanelManagerFirmware/include/nspm-bin-version.h
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#define NSPanelManagerFirmwareVersion "0.0.1426"
#define NSPanelManagerFirmwareVersion "0.0.1441"
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,19 @@
#include <Arduino.h>
#include <InterfaceConfigEnums.hpp>
#include <vector>

enum DEFAULT_PAGE {
MAIN_PAGE,
SCENES_PAGE,
ROOM_PAGE
};

class Scene;

class InterfaceConfig {
public:
static inline uint16_t homeScreen = 0;
static inline DEFAULT_PAGE default_page;
static inline bool lock_to_default_room = false;
static inline uint16_t colorTempMin = 2000;
static inline uint16_t colorTempMax = 6000;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "freertos/portmacro.h"
#include <ArduinoJson.h>
#include <ButtonManager.hpp>
#include <HomePage.hpp>
Expand Down Expand Up @@ -101,7 +102,7 @@ void InterfaceManager::_taskLoadConfigAndInit(void *param) {

// Loading is done, show Home page
NSPanel::instance->setDimLevel(InterfaceConfig::screen_dim_level);
PageManager::GetHomePage()->show();
InterfaceManager::showDefaultPage();
PageManager::GetHomePage()->setScreensaverTimeout(InterfaceConfig::screensaver_activation_timeout);
}

Expand All @@ -113,6 +114,16 @@ void InterfaceManager::_taskLoadConfigAndInit(void *param) {
vTaskDelete(NULL); // Delete task, we are done
}

void InterfaceManager::showDefaultPage() {
if (InterfaceConfig::default_page == DEFAULT_PAGE::MAIN_PAGE) {
PageManager::GetHomePage()->show();
} else if (InterfaceConfig::default_page == DEFAULT_PAGE::SCENES_PAGE) {
PageManager::GetScenePage()->show();
} else if (InterfaceConfig::default_page == DEFAULT_PAGE::ROOM_PAGE) {
PageManager::GetRoomPage()->show();
}
}

void InterfaceManager::_taskProcessMqttMessages(void *param) {
LOG_INFO("Started _taskProcessMqttMessages.");
vTaskDelay(100 / portTICK_PERIOD_MS);
Expand All @@ -125,7 +136,7 @@ void InterfaceManager::_taskProcessMqttMessages(void *param) {
try {
if (msg.topic.compare(NSPMConfig::instance->mqtt_screen_cmd_topic) == 0) {
if (msg.payload.compare("1") == 0) {
PageManager::GetHomePage()->show();
InterfaceManager::showDefaultPage();
MqttManager::publish(NSPMConfig::instance->mqtt_screen_state_topic, "1"); // Send out state information that panel woke from sleep
} else if (msg.payload.compare("0") == 0) {
PageManager::GetScreensaverPage()->show();
Expand Down Expand Up @@ -222,7 +233,7 @@ void InterfaceManager::subscribeToMqttTopics() {

void InterfaceManager::processWakeEvent() {
LOG_DEBUG("Got wake event from panel, activating home page.");
PageManager::GetHomePage()->show();
InterfaceManager::showDefaultPage();
}

void InterfaceManager::processSleepEvent() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class InterfaceManager {
static inline void handleNSPanelCommand(char *topic, byte *payload, unsigned int length);
static inline void handleNSPanelScreenBrightnessCommand(char *topic, byte *payload, unsigned int length);
static inline void handleNSPanelScreensaverBrightnessCommand(char *topic, byte *payload, unsigned int length);
static void showDefaultPage();

private:
/// @brief The task that handles startup if InterfaceManager. It load the config from the server and processes it and
Expand All @@ -60,8 +61,6 @@ class InterfaceManager {
/// @param buffer The buffer to put the JSON-data in to
/// @return True if sucessful, otherwise false
bool _getRoomConfig(int room_id, DynamicJsonDocument *buffer);
/// @brief Set current light mode, handle starting/stopping special light mode
/// @param mode The mode to set
};

#endif
2 changes: 1 addition & 1 deletion firmware/NSPanelManagerFirmware/lib/MqttLog/MqttLog.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef MqttLog_H
#define MqttLog_H

#define LOG_TO_SERIAL 1 // Set to 1 to enable
#define LOG_TO_SERIAL 0 // Set to 1 to enable

#include <Arduino.h>
#include <MqttManager.hpp>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void RoomPage::processTouchEvent(uint8_t page, uint8_t component, bool pressed)
switch (component) {
case ROOM_PAGE_BACK_BUTTON_ID:
// NSPanel::instance->goToPage(HOME_PAGE_NAME);
PageManager::GoBack();
PageManager::GetHomePage()->show();
break;
case ROOM_PAGE_PREVIOUS_ROOM_BUTTON_ID:
RoomManager::goToPreviousRoom();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ void ScenePage::processTouchEvent(uint8_t page, uint8_t component, bool pressed)
// Release events
switch (component) {
case SCENES_PAGE_BACK_BUTTON_ID: {
PageManager::GoBack();
PageManager::GetHomePage()->show();
break;
}
case SCENES_PAGE_SCENE1_LABEL_ID: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ void RoomManager::loadAllRooms(bool is_update) {
// Config downloaded, process the raw data
// The config also contains other config values for the interface. Populate InterfaceConfig
InterfaceConfig::homeScreen = (*roomData)["home"].as<uint16_t>();
InterfaceConfig::default_page = static_cast<DEFAULT_PAGE>((*roomData)["default_page"].as<uint8_t>());
InterfaceConfig::colorTempMin = (*roomData)["color_temp_min"].as<uint16_t>();
InterfaceConfig::colorTempMax = (*roomData)["color_temp_max"].as<uint16_t>();
InterfaceConfig::reverseColorTempSlider = (*roomData)["reverse_color_temp"].as<String>().equals("True");
Expand Down
Binary file modified firmware/NSPanelManagerFirmware/merged-flash.bin
Binary file not shown.
3 changes: 1 addition & 2 deletions firmware/NSPanelManagerFirmware/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ float readNTCTemperature(bool farenheit) {
}

void registerToNSPanelManager() {
while (true) {
while (WiFi.isConnected()) {
WiFiClient wifiClient;
HTTPClient httpClient;
std::string url = "http://";
Expand Down Expand Up @@ -215,7 +215,6 @@ void taskManageWifiAndMqtt(void *param) {

void setup() {
Serial.begin(115200);

// Load config if any, and if it fails. Factory reset!
if (!(config.init() && config.loadFromLittleFS())) {
config.factoryReset();
Expand Down

0 comments on commit 283781c

Please sign in to comment.