@JohnGalt cool.
congratulations.
It’s may be worth to show the community what you have done?
Regards,
Ralf
@JohnGalt cool.
congratulations.
It’s may be worth to show the community what you have done?
Regards,
Ralf
@xppaicyber
Cool!
If I understood your structure and approach correctly than this nice module could be used for any of recurring events, because the events are declared in the config.js definition of the module.
Unfortunately you have hard coded the header of the module
header.innerHTML = "NOUNISH REMINDERS";
Do you think it is possible to get this header configurable as well?
This would be really great!
Thanks a lot!
Warm regards,
Ralf
@htilburgs :-)
this is correct on console window.
console didn’t know about display unless you’re telling him what display to use.
As far as I know you can use
DISPLAY=:0.0
as a hint upfront your terminal command.
At least for xrandr this works and is necessary.
DISPLAY=:0.0 xrandr --output HDMI-1 --off
is my xrandr console equivalent for the “normal” command
xrandr --output HDMI-1 --off
I’m not THAT sure if this is true for wlr-randr .
(Because wlr-randr do have this environment variable “WAYLAND_DISPLAY” which is not the case for xrandr…)
HTH & regards,
Ralf
@JohnGalt
just seen while re-reading my last posting:
nodehelper.js (the part of the module which is communicating with the python program and so with the sensor) is calling python3 :
exec(`python3 ./modules/MMM-BME280/bme280.py ${deviceAddr}`, (error, stdout) => {
but the python script itself is referencing python 2 (see above post, source code of bme280.py, 1st line:
#!/usr/bin/python
I guess this must match and doesn’t …
So may this is the cause of your problems.
And if this is true it is may really hard to get this working because you may run in several incompatibilities and library-conflicts …
Regards,
Ralf
the python script you are looking for is bme280.py
#!/usr/bin/python
#--------------------------------------
# ___ ___ _ ____
# / _ \/ _ \(_) __/__ __ __
# / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/ /_/___/ .__/\_, /
# /_/ /___/
#
# bme280.py
# Read data from a digital pressure sensor.
#
# Official datasheet available from :
# https://www.bosch-sensortec.com/bst/products/all_products/bme280
#
# Author : Matt Hawkins
# Date : 21/01/2018
#
# https://www.raspberrypi-spy.co.uk/
#
#--------------------------------------
import smbus
import sys
import time
from ctypes import c_short
from ctypes import c_byte
from ctypes import c_ubyte
DEVICE = 0x76 # Default device I2C address
try: #override device address like '0x77'
DEVICE = int(sys.argv[1], 16)
except:
pass
bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
# Rev 1 Pi uses bus 0
def getShort(data, index):
# return two bytes from data as a signed 16-bit value
return c_short((data[index+1] << 8) + data[index]).value
def getUShort(data, index):
# return two bytes from data as an unsigned 16-bit value
return (data[index+1] << 8) + data[index]
def getChar(data,index):
# return one byte from data as a signed char
result = data[index]
if result > 127:
result -= 256
return result
def getUChar(data,index):
# return one byte from data as an unsigned char
result = data[index] & 0xFF
return result
def readBME280ID(addr=DEVICE):
# Chip ID Register Address
REG_ID = 0xD0
(chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
return (chip_id, chip_version)
def readBME280All(addr=DEVICE):
# Register Addresses
REG_DATA = 0xF7
REG_CONTROL = 0xF4
REG_CONFIG = 0xF5
REG_CONTROL_HUM = 0xF2
REG_HUM_MSB = 0xFD
REG_HUM_LSB = 0xFE
# Oversample setting - page 27
OVERSAMPLE_TEMP = 2
OVERSAMPLE_PRES = 2
MODE = 1
# Oversample setting for humidity register - page 26
OVERSAMPLE_HUM = 2
bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)
control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE
bus.write_byte_data(addr, REG_CONTROL, control)
# Read blocks of calibration data from EEPROM
# See Page 22 data sheet
cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)
# Convert byte data to word values
dig_T1 = getUShort(cal1, 0)
dig_T2 = getShort(cal1, 2)
dig_T3 = getShort(cal1, 4)
dig_P1 = getUShort(cal1, 6)
dig_P2 = getShort(cal1, 8)
dig_P3 = getShort(cal1, 10)
dig_P4 = getShort(cal1, 12)
dig_P5 = getShort(cal1, 14)
dig_P6 = getShort(cal1, 16)
dig_P7 = getShort(cal1, 18)
dig_P8 = getShort(cal1, 20)
dig_P9 = getShort(cal1, 22)
dig_H1 = getUChar(cal2, 0)
dig_H2 = getShort(cal3, 0)
dig_H3 = getUChar(cal3, 2)
dig_H4 = getChar(cal3, 3)
dig_H4 = (dig_H4 << 24) >> 20
dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)
dig_H5 = getChar(cal3, 5)
dig_H5 = (dig_H5 << 24) >> 20
dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)
dig_H6 = getChar(cal3, 6)
# Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575)
time.sleep(wait_time/1000) # Wait the required time
# Read temperature/pressure/humidity
data = bus.read_i2c_block_data(addr, REG_DATA, 8)
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]
#Refine temperature
var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11
var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14
t_fine = var1+var2
temperature = float(((t_fine * 5) + 128) >> 8);
# Refine pressure and adjust for temperature
var1 = t_fine / 2.0 - 64000.0
var2 = var1 * var1 * dig_P6 / 32768.0
var2 = var2 + var1 * dig_P5 * 2.0
var2 = var2 / 4.0 + dig_P4 * 65536.0
var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
var1 = (1.0 + var1 / 32768.0) * dig_P1
if var1 == 0:
pressure=0
else:
pressure = 1048576.0 - pres_raw
pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
var1 = dig_P9 * pressure * pressure / 2147483648.0
var2 = pressure * dig_P8 / 32768.0
pressure = pressure + (var1 + var2 + dig_P7) / 16.0
# Refine humidity
humidity = t_fine - 76800.0
humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)))
humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
if humidity > 100:
humidity = 100
elif humidity < 0:
humidity = 0
return temperature/100.0,pressure/100.0,humidity
def main():
# (chip_id, chip_version) = readBME280ID()
# print("Chip ID :", chip_id)
# print("Version :", chip_version)
temperature,pressure,humidity = readBME280All()
print(round(temperature,1),round(humidity,1),round(pressure,1))
if __name__=="__main__":
main()
@JohnGalt said in AHT20 Humidity + Temperature Sensor:
Remote I/O error
The given error seems to by not a program but an I/O problem.
I’m not familiar with this sensor so I do not know how to connect and - most important - how to figure out the right “deviceAddress” - it seems that there is the error located.
Either the address isn’t the correct one or the IO channel is somehow broken.
For the latter came in my mind: if this is a I2C conected device - do you have enabled I2C on your Raspi?
I’ve tried to “understand” what happens in the python script above as well as in the C-exmaple program on the Bosch product page for bme280 sensor, but didn’t got it…
Regards,
Ralf
@htilburgs said in V2.31.0 unable to start:
-bash: wlr_randr: command not found
shouldn’t it be wlr-randr ?
Regards,
Ralf
@sdetweil said in MMM-Homeassistant-sensors doesn't work anymore, recommended alternative.:
git clone
Dear Sam, you are SO right!
Sorry - typo …
Have edited above in my first post.
Thanks for paying attention!
Regards,
Ralf
@flac_rules
If you git-pull the second one - which seems to have the exact same name - the git-clone (<- edited!) will fail.
But if you rename the „original“ directory with e.g.
mv MMM-homeassistant-sensors MMM-homeassistant-sensors_original
you should be able to issue a git clone (<- edited) for the second variant, install this and give it a try.
If t his doesn‘t work, either - delete the newly created directory and re-rename the original one …
Regards,
Ralf
@JohnGalt Good morning,
do you have connected the sensors locally to the same PI where the mirror is running?
What script are you using and what output this sends?
If you are able to modify these scripts to deliver a JSON output you may can use MMM-JsonValue for displaying the results…
Regards,
Ralf
@kool said
Bumping this back up. Pleeeease help
Dear @kool ,
if you are using url as suggested by Sam ( @sdetweil ), you are nearly done.
As far as I can see from my rookie perspective you do have some redundancies in your config.js (e.g. the unit section: units, tempUnits, windUnits) ) but this shouldn’t disturb.
As far as I understood you can delete these icontables because you do not use the icon-font but try to use some images from sigle file-URLs instead - so you can delete the whole section iconTable {} with all entries.
In addition you have to adapt (see above, Sam’s tip) the URL of all you images in your custom.css file.
(pls. double check, if the files are really in these locations)
You wrote in your current css
.weatherforecast .wi-day-sunny {
content: url("/home/kool/MagicMirror/css/icons/6fas/day.svg") !important;
}
IF your weather-icon files are really in this directory (/home/kool/MagicMirror/css/icons/6fas/) than your css should be as follows:
.weatherforecast .wi-day-sunny {
content: url("/css/icons/6fas/day.svg");
You do not need the !important flag (in my case)
second wrong thing besides the URL is your qualifier.
you are using
.weatherforecast .wi-something ....
This cannot be recognized because .weatherforecast is not defined.
At first you have to decide if you want to have different icons for the current weather and for the weather forecast.
(In my case this is true).
IF you would like to have this you have to differentiate the two instances of the weather-module by a “classes” definition.
For example your first instance of the weather module (current weather) than should be
module: "weather",
position: "top_right", // Adjust position as needed
classes: "weather_current",
config: {
weatherProvider: "openmeteo", // Specify the Open-Meteo provider
apiBase: "https://api.open-meteo.com/v1", // REQUIRED: Base URL for Open-Meteo
lat: xxxx, // REQUIRED: Latitude of the location
lon: xxxx, // REQUIRED: Longitude of the location
maxNumberOfDays: 8, // OPTIONAL: Number of forecast days (default is 5)
pastDays: 0, // OPTIONAL: Number of past days of data to include (default is 0)
units: "imperial", // Set this to 'imperial' for Fahrenheit and miles per hour
tempUnits: "imperial", // Make sure to match with 'imperial'
windUnits: "imperial",
type: "current", // OPTIONAL: Change to "current" if only current weather data is desired
}
},
(pay attention for the third line: classes: “weather_current”, )
THIS is your qualifier if you are about to diffrentiate between current weather and weather forecast image-wise.
(“weather_current” is just an example! you can name it like you want every name is suitable and OK, only pay attention that all of these namings are strictly case sensitive, so Weather is NOT the same as weather"
Your correct line for custom.css than is:
.weather_current .wi-day-sunny {
content: url("/css/icons/6fas/day.svg");
and the same dance than for your second instance with DIFFERENT classes-clause in config.js
(e.g. a " classes: “weather_forecast”, " in the definition of the second weather instance ) results in a custom.css entry like this:
.weather_forecast .wi-day-sunny {
content: url("/css/icons/some_other_directory_with_smaller_icons/day.svg");
Because the “forecast instance” of the weather module is (in my case) organized as table I found it really useful to differentite these logos - big ones for current, smaller ones for the forecast:

If You do NOT like to differentiate the current and forecast instance you do NOT need the classes-phrase in config.js and your correct qualifier is the name of the module (so “weather” ) and your custom.css entry is like this:
.weather .wi-day-sunny {
content: url("/css/icons/6fas/day.svg");
And this than is valid for both instances.
Keep in mind that there are a LOT more weather conditions than the two times 5 conditions you have defined in your current custom.css!
my own definition for the current weather for your reference:
.weather_current .wi-fog {
content: url("/css/icons/current/wsymbol_0007_fog.png");
}
.weather_current .wi-cloudy {
content: url("/css/icons/current/wsymbol_0002_sunny_intervals.png");
}
.weather_current .wi-cloudy-windy {
content: url("/css/icons/current/wsymbol_0004_black_low_cloud.png");
}
.weather_current .wi-rain {
content: url("/css/icons/current/wsymbol_0018_cloudy_with_heavy_rain.png");
}
.weather_current .wi-showers {
content: url("/css/icons/current/wsymbol_0017_cloudy_with_light_rain.png");
}
.weather_current .wi-thunderstorm {
content: url("/css/icons/current/wsymbol_0024_thunderstorms.png");
}
.weather_current .wi-snow {
content: url("/css/icons/current/wsymbol_0019_cloudy_with_light_snow.png");
}
.weather_current .wi-snowflake-cold {
content: url("/css/icons/current/wsymbol_0020_cloudy_with_heavy_snow.png");
}
.weather_current .wi-na {
content: url("/css/icons/current/wsymbol_0999_unknown.png");
}
.weather_current .wi-day-sunny {
content: url("/css/icons/current/wsymbol_0001_sunny.png");
}
.weather_current .wi-day-cloudy {
content: url("/css/icons/current/wsymbol_0043_mostly_cloudy.png");
}
.weather_current .wi-day-cloudy-gusts {
content: url("/css/icons/current/wsymbol_0004_black_low_cloud.png");
}
.weather_current .wi-day-cloudy-windy {
content: url("/css/icons/current/wsymbol_0004_black_low_cloud.png");
}
.weather_current .wi-cloudy-windy {
content: url("/css/icons/current/wsymbol_0004_black_low_cloud.png");
}
.weather_current .wi-day-fog {
content: url("/css/icons/current/wsymbol_0007_fog.png");
}
.weather_current .wi-day-hail {
content: url("/css/icons/current/wsymbol_0015_heavy_hail_showers.png");
}
.weather_current .wi-day-haze {
content: url("/css/icons/current/wsymbol_0005_hazy_sun.png");
}
.weather_current .wi-day-lightning {
content: url("/css/icons/current/wsymbol_0016_thundery_showers.png");
}
.weather_current .wi-day-rain {
content: url("/css/icons/current/wsymbol_0085_extreme_rain_showers.png");
}
.weather_current .wi-day-rain-mix {
content: url("/css/icons/current/wsymbol_0009_light_rain_showers.png");
}
.weather_current .wi-day-rain-wind {
content: url("/css/icons/current/wsymbol_0010_heavy_rain_showers.png");
}
.weather_current .wi-day-showers {
content: url("/css/icons/current/wsymbol_0018_cloudy_with_heavy_rain.png");
}
.weather_current .wi-day-sleet {
content: url("/css/icons/current/wsymbol_0087_heavy_sleet_showers.png");
}
.weather_current .wi-day-sleet-storm {
content: url("/css/icons/current/wsymbol_0089_heavy_sleet.png");
}
.weather_current .wi-day-snow {
content: url("/css/icons/current/wsymbol_0011_light_snow_showers.png");
}
.weather_current .wi-day-snow-thunderstorm {
content: url("/css/icons/current/wsymbol_0057_thundery_snow_showers.png");
}
.weather_current .wi-day-snow-wind {
content: url("/css/icons/current/wsymbol_0053_blowing_snow.png");
}
.weather_current .wi-day-sprinkle {
content: url("/css/icons/current/wsymbol_0009_light_rain_showers.png");
}
.weather_current .wi-day-storm-showers {
content: url("/css/icons/current/wsymbol_0018_cloudy_with_heavy_rain.png");
}
.weather_current .wi-day-sunny-overcast {
content: url("/css/icons/current/wsymbol_0002_sunny_intervals.png");
}
.weather_current .wi-day-thunderstorm {
content: url("/css/icons/current/wsymbol_0024_thunderstorms.png");
}
.weather_current .wi-day-windy {
content: url("/css/icons/current/wsymbol_0060_windy.png");
}
.weather_current .wi-solar-eclipse {
content: url("/css/icons/current/wsymbol_0005_hazy_sun.png");
}
.weather_current .wi-hot {
content: url("/css/icons/current/wsymbol_0045_hot.png");
}
.weather_current .wi-day-cloudy-high {
content: url("/css/icons/current/wsymbol_0006_mist.png");
}
.weather_current .wi-day-light-wind {
content: url("/css/icons/current/wsymbol_0060_windy.png");
}
.weather_current .wi-night-clear {
content: url("/css/icons/current/wsymbol_0008_clear_sky_night.png");
}
.weather_current .wi-night-alt-cloudy {
content: url("/css/icons/current/wsymbol_0041_partly_cloudy_night.png");
}
.weather_current .wi-night-alt-partly-cloudy {
content: url("/css/icons/current/wsymbol_0041_partly_cloudy_night.png");
}
.weather_current .wi-night-alt-cloudy-gusts {
content: url("/css/icons/current/wsymbol_0041_partly_cloudy_night.png");
}
.weather_current .wi-night-alt-cloudy-windy {
content: url("/css/icons/current/wsymbol_0041_partly_cloudy_night.png");
}
.weather_current .wi-night-alt-hail {
content: url("/css/icons/current/wsymbol_0031_heavy_hail_showers_night.png");
}
.weather_current .wi-night-alt-lightning {
content: url("/css/icons/current/wsymbol_0032_thundery_showers_night.png");
}
.weather_current .wi-night-alt-rain {
content: url("/css/icons/current/wsymbol_0025_light_rain_showers_night.png");
}
.weather_current .wi-night-alt-rain-mix {
content: url("/css/icons/current/wsymbol_0026_heavy_rain_showers_night.png");
}
.weather_current .wi-night-alt-rain-wind {
content: url("/css/icons/current/wsymbol_0026_heavy_rain_showers_night.png");
}
.weather_current .wi-night-alt-showers {
content: url("/css/icons/current/wsymbol_0025_light_rain_showers_night.png");
}
.weather_current .wi-night-alt-sleet {
content: url("/css/icons/current/wsymbol_0029_sleet_showers_night.png");
}
.weather_current .wi-night-alt-sleet-storm {
content: url("/css/icons/current/wsymbol_0029_sleet_showers_night.png");
}
.weather_current .wi-night-alt-snow {
content: url("/css/icons/current/wsymbol_0028_heavy_snow_showers_night.png");
}
.weather_current .wi-night-alt-snow-thunderstorm {
content: url("/css/icons/current/wsymbol_0075_thundery_snow_showers_night.png");
}
.weather_current .wi-night-alt-snow-wind {
content: url("/css/icons/current/wsymbol_0071_blowing_snow_night.png");
}
.weather_current .wi-night-alt-sprinkle {
content: url("/css/icons/current/wsymbol_0025_light_rain_showers_night.png");
}
.weather_current .wi-night-alt-storm-showers {
content: url("/css/icons/current/wsymbol_0026_heavy_rain_showers_night.png");
}
.weather_current .wi-night-alt-thunderstorm {
content: url("/css/icons/current/wsymbol_0032_thundery_showers_night.png");
}
.weather_current .wi-night-cloudy {
content: url("/css/icons/current/wsymbol_0041_partly_cloudy_night.png");
}
.weather_current .wi-night-cloudy-gusts {
content: url("/css/icons/current/wsymbol_0044_mostly_cloudy_night.png");
}
.weather_current .wi-night-cloudy-windy {
content: url("/css/icons/current/wsymbol_0044_mostly_cloudy_night.png");
}
.weather_current .wi-night-fog {
content: url("/css/icons/current/wsymbol_0064_fog_night.png");
}
.weather_current .wi-night-hail {
content: url("/css/icons/current/wsymbol_0039_cloudy_with_heavy_hail_night.png");
}
.weather_current .wi-night-lightning {
content: url("/css/icons/current/wsymbol_0032_thundery_showers_night.png");
}
.weather_current .wi-night-partly-cloudy {
content: url("/css/icons/current/wsymbol_0041_partly_cloudy_night.png");
}
.weather_current .wi-night-rain {
content: url("/css/icons/current/wsymbol_0025_light_rain_showers_night.png");
}
.weather_current .wi-night-rain-mix {
content: url("/css/icons/current/wsymbol_0026_heavy_rain_showers_night.png");
}
.weather_current .wi-night-rain-wind {
content: url("/css/icons/current/wsymbol_0025_light_rain_showers_night.png");
}
.weather_current .wi-night-showers {
content: url("/css/icons/current/wsymbol_0026_heavy_rain_showers_night.png");
}
.weather_current .wi-night-sleet {
content: url("/css/icons/current/wsymbol_0029_sleet_showers_night.png");
}
.weather_current .wi-night-sleet-storm {
content: url("/css/icons/current/wsymbol_0029_sleet_showers_night.png");
}
.weather_current .wi-night-snow {
content: url("/css/icons/current/wsymbol_0027_light_snow_showers_night.png");
}
.weather_current .wi-night-snow-thunderstorm {
content: url("/css/icons/current/wsymbol_0075_thundery_snow_showers_night.png");
}
.weather_current .wi-night-snow-wind {
content: url("/css/icons/current/wsymbol_0028_heavy_snow_showers_night.png");
}
.weather_current .wi-night-sprinkle {
content: url("/css/icons/current/wsymbol_0025_light_rain_showers_night.png");
}
.weather_current .wi-night-storm-showers {
content: url("/css/icons/current/wsymbol_0026_heavy_rain_showers_night.png");
}
.weather_current .wi-night-thunderstorm {
content: url("/css/icons/current/wsymbol_0032_thundery_showers_night.png");
}
HTH & good luck!
Ralf
@atwist said in MMM-Universal-Pir - Desparately seeking right command:
DISPLAY=0.0 xrandr --output HDMI-2 --off
Dear @atwist, guessing from the distance is quite hard.
You didn’t provide system information.
From your told story you can try to check two things which came in my mind:
Good luck,
Ralf
@sdetweil :-) For me this is pretty clear and obvious - in addition I do NOT perform every update/upgrade (“never touch a running system”) because I’m checking upfront if a new release brings in anything I potentially need.
But the thread opener is at least irritated and asks for commandlines to copy.
I assume the thread opener is aware that everything herein is “enter at your own risk”.
That you - as the script creator and owner - are even more cautious is appropriate and highly welcome and appreciated!
Ralf
@gullymat said in Bugsounet and MMM-Pir:
needs like 10 sec to activate the screen form the pir, often startup failures
I guess this is because of the fact that bugsounet has much more functionalty built in (screen dimming, count down display) - which exactly is the reason why i love it that much :-)
Ralf
@sdetweil said in MMM-ioBroker - it will not show:
i dont supply a copy/paste for that because i dont want people using it if its not needed,
valid point, but @kusselin seems to struggle :-)
Regards,
Ralf
@kusselin said
Can you please tell me the Linux commands I need to use to get it working again.
Hi @kusselin , Sam is talking about parameters you can - and should - overhand to his update-script.
If you call the script - as is - without parameter the script only do a “test-run” and did not change anything.
The “normal” parameter to DO the upgrade is “apyly” for this the unix command is:
bash -c "$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/upgrade-script.sh)" -apply
Sam is assuming that you already HAVE done some upgrades - for this reason he states “and you loaded the new code” . IF you had already loaded some new versions the above command will “fail” also because you already HAVE the new version.
So for this case you have to use the “force” parameter.
The unix command for this is:
bash -c "$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/upgrade-script.sh)" -force
Good luck!
Ralf
@BKeyport OK, thanks for your viewpoint!
Than I‘m on the right way - still works today :-)
Temperature was 45°C today in the morning - was at 56° everytime before …
So even passive cooling seems to be much better.
Nice rest of weekeend to all of you.
Ralf
@sdetweil :-) indeed ….
(Fits millimeter-exactly behind the mirror no more space left…)
But seems to work.